package com.qp.smsmarketing.view.mbean;

import com.qp.smsmarketing.dao.ContatoDAO;
import com.qp.smsmarketing.dao.GrupoDAO;
import com.qp.smsmarketing.dao.OperacaoDAO;
import com.qp.smsmarketing.dao.PapelDAO;
import com.qp.smsmarketing.entity.Papel;
import com.qp.smsmarketing.entity.Operacao;
import com.qp.smsmarketing.view.*;
import com.qp.smsmarketing.view.mbean.abstractmbean.AbstractMBean;
import java.awt.Component;
import java.io.File;
import java.util.*;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
/**
 *
 * @author waldenilson
 */
public class Init extends AbstractMBean {

    private GrupoMBean grupombean;
    private GrupoDAO grupoDAO;
    private ContatoDAO contatoDAO;
    private View view;
    private ContatoMBean contmbean;
    private UsuarioMBean usuariombean;
    private MensagemMBean msgmbean;

    public void iniciar(View v) {
        
        // System.out.println( v.getLbUsuario().getText() );
        // CHAMADA DO LOGIN
        LoginMBean l = new LoginMBean();
        l.exibirView(new ViewLogin(null, true, v));


        // INICIAR CARREGAMENTOS DAS ABAS
        new GrupoMBean().filtraTodosGrupos(v); 
        new ContatoMBean().filtraTodos(v); 
        MensagemMBean mensagemMBean = new MensagemMBean();
        mensagemMBean.filtraTodasMensagens(v);
        mensagemMBean.filtraTodos(v);
        
        analisarTabelaInitBD();
    }

    public Init() {
    }

    public Init(String look, Component c) {
        internacionalizar("pt", "BR");
        // lookandfell
        try {
            UIManager.setLookAndFeel(look);
            SwingUtilities.updateComponentTreeUI(c);
        } catch (Exception e) {
        }

    }

    public void menuCadastroGrupo(View v) {
        if (verificarPermissaoOperacao(Integer.parseInt(v.getName()), "Cadastro de Grupos")) {
            grupombean = new GrupoMBean();
            grupombean.exibirView(new ViewGrupo());
        } else {
            JOptionPane.showMessageDialog(null, "Você não tem permissão para acessar essa funcionalidade.", "", 1);
        }
    }

    public void menuFerramentasImpExp() {
        new ImpExpMBean().exibirView(new ViewImpExp(null, true));
    }

    public void menuFerramentasEstatistica() {
        new EstatisticaMBean().exibirView(new ViewEstatistica(null, true));
    }

    public void menuFerramentasLimpeza() {
        LimpezaMBean limp = new LimpezaMBean();
        limp.exibirView(new ViewLimpeza(null, true));
    }

    public void menuCadastroContato(View v) {
        if (verificarPermissaoOperacao(Integer.parseInt(v.getName()), "Cadastro de Contatos")) {
            contmbean = new ContatoMBean();
            contmbean.exibirView(new ViewContato());
        } else {
            JOptionPane.showMessageDialog(null, "Você não tem permissão para acessar essa funcionalidade.", "", 1);
        }
    }

    public void menuCadastroUsuario(View v) {

        if (verificarPermissaoOperacao(Integer.parseInt(v.getName()), "Cadastro de Usuários")) {
            usuariombean = new UsuarioMBean();
            usuariombean.exibirView(new ViewUsuario());
        } else {
            JOptionPane.showMessageDialog(null, "Você não tem permissão para acessar essa funcionalidade.", "", 1);
        }
    }

    public void menuCadastroMensagem(View v) {
        if (verificarPermissaoOperacao(Integer.parseInt(v.getName()), "Cadastro de Mensagens")) {
            msgmbean = new MensagemMBean();
            msgmbean.exibirView(new ViewMensagem());
        } else {
            JOptionPane.showMessageDialog(null, "Você não tem permissão para acessar essa funcionalidade.", "", 1);
        }

    }

    public void menuCadastroEnvioMensagem(View v) {
        EnvioMensagemMBean em = new EnvioMensagemMBean();
        em.exibirView(new ViewEnvioMensagem());
    }

    public void menuConfiguracoesOpcoes() {
        OpcoesMBean opcoes = new OpcoesMBean();
        opcoes.exibirView(new ViewOpcoes(null, true));
    }

    public void menuInformacoesModem() {
        ModemMBean m = new ModemMBean();
        m.exibirView(new ViewModem(null, true));
    }

    public void menuAjudaSobre() {
        new SobreMBean().exibirView(new ViewSobre(null, true));
    }

    public void menuAjudaManual() {
        new ManualMBean().exibirView(new ViewManual(null, true));
    }

    public void backupDados(View v, String tipoBackup) {

        if (tipoBackup.equals("CLIENT")) {
            JFileChooser fc = new JFileChooser();
            fc.setApproveButtonText("Salvar");
            fc.setDialogType(JFileChooser.SAVE_DIALOG);
            fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            int res = fc.showSaveDialog(v);

            if (res == JFileChooser.APPROVE_OPTION) {
                realizarBackup("contatos.sqlite", fc.getSelectedFile() + "/contatos.sqlite");
            } else {
                // cancelou a caixa de dialogo
            }
        } else if (tipoBackup.equals("AUTO")) {
            File f = new File("backupDados");
            if (f.exists() && f.isDirectory()) {
                realizarBackup("contatos.sqlite", "backupDados/contatos.sqlite");
            } else {
                f.mkdir();
                realizarBackup("contatos.sqlite", "backupDados/contatos.sqlite");
            }
        }
    }

    private void realizarBackup(String pathIn, String pathOut) {
        // criar metodo para gerar xml dos dados do banco para backup em *.txt
        // criar metodo para importar ( save or update ) os dados para o banco,
        //com autorizaÃ§Ã£o pelo administrador
    }

    public JTree criarArvore(JTree tree) {
        DefaultMutableTreeNode pastas = new DefaultMutableTreeNode("");
        DefaultMutableTreeNode sms = new DefaultMutableTreeNode("SMS (0)");
//            DefaultMutableTreeNode email = new DefaultMutableTreeNode("Email (0)");
        pastas.add(sms);
        DefaultMutableTreeNode sRascunhos = new DefaultMutableTreeNode("Recebidos (0)");
        sms.add(sRascunhos);
        DefaultMutableTreeNode sEnviados = new DefaultMutableTreeNode("Enviados (0)");
        sms.add(sEnviados);
        DefaultMutableTreeNode sAgendados = new DefaultMutableTreeNode("Agendados (0)");
        sms.add(sAgendados);
        DefaultMutableTreeNode sExcluidos = new DefaultMutableTreeNode("Removidos (0)");
        sms.add(sExcluidos);
//            pastas.add(email);
//                DefaultMutableTreeNode eRecebidos = new DefaultMutableTreeNode("Recebidos (0)");  email.add(eRecebidos);
//                DefaultMutableTreeNode eEnviados = new DefaultMutableTreeNode("Enviados (0)");    email.add(eEnviados);
//                DefaultMutableTreeNode eAgendados = new DefaultMutableTreeNode("Agendados (0)");  email.add(eAgendados);
//                DefaultMutableTreeNode eExcluidos = new DefaultMutableTreeNode("Removidos (0)");  email.add(eExcluidos);
//                email.add(eEnviados);
        tree = new JTree(pastas);
        tree.setSelectionPath(new TreePath(tree.getModel().getRoot()));
        return tree;
    }

    private void expandAll(JTree tree, TreePath parent, boolean expand) {
        // Traverse children
        TreeNode node = (TreeNode) parent.getLastPathComponent();
        if (node.getChildCount() >= 0) {
            for (Enumeration e = node.children(); e.hasMoreElements();) {
                TreeNode n = (TreeNode) e.nextElement();
                TreePath path = parent.pathByAddingChild(n);
                expandAll(tree, path, expand);
            }
        }

        // Expansion or collapse must be done bottom-up
        if (expand) {
            tree.expandPath(parent);
        } else {
            tree.collapsePath(parent);
        }
    }

    private void analisarTabelaInitBD() {
        // VERIFICAR PAPEIS CRIADOS NO BD
        PapelDAO pdao = new PapelDAO();
        List<Papel> lp = pdao.buscarTodos();
        boolean achouAdmin = false;
        boolean achouOper = false;
        for (Papel p : lp) {
            if (p.getNomeRole().equals("ADMINISTRADOR")) {
                achouAdmin = true;
            }
            if (p.getNomeRole().equals("OPERADOR")) {
                achouOper = true;
            }
        }
        if (!achouAdmin) {
            Papel p1 = new Papel();
            p1.setNomeRole("ADMINISTRADOR");
            p1.setDescricaoRole("");
            pdao.salvarObj(p1);
        }
        if (!achouOper) {
            Papel p2 = new Papel();
            p2.setNomeRole("OPERADOR");
            p2.setDescricaoRole("");
            pdao.salvarObj(p2);
        }

        // VERIFICAR OPERACOES CRIADAS NO BD
        OperacaoDAO odao = new OperacaoDAO();
        List<Operacao> lo = odao.buscarTodos();
        boolean achouGrupos = false;
        boolean achouContatos = false;
        boolean achouMensages = false;
        boolean achouUsuarios = false;
        for (Operacao op : lo) {
            if (op.getNomeOperacao().equals("Cadastro de Grupos")) {
                achouGrupos = true;
            }
            if (op.getNomeOperacao().equals("Cadastro de Contatos")) {
                achouContatos = true;
            }
            if (op.getNomeOperacao().equals("Cadastro de Mensagens")) {
                achouMensages = true;
            }
            if (op.getNomeOperacao().equals("Cadastro de Usuários")) {
                achouUsuarios = true;
            }
        }
        if (!achouGrupos) {
            Operacao o1 = new Operacao();
            o1.setNomeOperacao("Cadastro de Grupos");
            odao.salvarObj(o1);
        }
        if (!achouContatos) {
            Operacao o2 = new Operacao();
            o2.setNomeOperacao("Cadastro de Contatos");
            odao.salvarObj(o2);
        }
        if (!achouMensages) {
            Operacao o3 = new Operacao();
            o3.setNomeOperacao("Cadastro de Mensagens");
            odao.salvarObj(o3);
        }
        if (!achouUsuarios) {
            Operacao o4 = new Operacao();
            o4.setNomeOperacao("Cadastro de Usuários");
            odao.salvarObj(o4);
        }
    }

    /**
     *
     * @param view View Principal.
     * @param buttonGroup Grupos de Botoes.
     * @param valorCampo Valor a ser pesquisado.
     * @param tabbedPane Aba Selecionada
     */
    public void filtrar(View view, ButtonGroup buttonGroup, JTextField valorCampo, JTabbedPane tabbedPane) {
        String bgSelecionado;
        int abaSelecionada = tabbedPane.getSelectedIndex();
        grupombean = new GrupoMBean();
        contmbean = new ContatoMBean();
        msgmbean = new MensagemMBean();
        //Pega todos os RadioButtons do GroupButton
        Enumeration<AbstractButton> elements = buttonGroup.getElements();

        //Coloca todos os elementos em uma lista
        List<AbstractButton> listaButtons = Collections.list(elements);

        //LaÃ§o para percorrer todos os JRadioButtons e verificar qual estÃ¡ selecionado
        for (int i = 0; i < listaButtons.size(); i++) {
            if (buttonGroup.isSelected(listaButtons.get(i).getModel())) {
                bgSelecionado = listaButtons.get(i).getActionCommand().toLowerCase();//referencia para o nome do botao;
                switch (abaSelecionada) {
                    case 0:
                        //aba principal
                        filtro(view, bgSelecionado, valorCampo.getText());
                        break;
                    case 1:
                        //aba grupos
                        filtro(view, bgSelecionado, valorCampo.getText());
                        break;
                    case 2:
                        //aba contatos
                        filtro(view, bgSelecionado, valorCampo.getText());
                        break;
                    case 3:
                        //aba mensagens
                        filtro(view, bgSelecionado, valorCampo.getText());
                        break;
                    case 4:
                        //aba agendadas
                        filtro(view, bgSelecionado, valorCampo.getText());
                        break;
                    case 5:
                        //aba estatistica
                        filtro(view, bgSelecionado, valorCampo.getText());
                        break;
                }
            }
        }
    }

    /**
     *
     * @param view
     * @param bgSelecionado
     * @param text
     */
    private void filtro(View view, String bgSelecionado, String text) {
        Date dataAgendada1 = view.getjXdataInicio().getDate();
        Date dataAgendada2 = view.getjXdataFim().getDate();
        Date dataEstatistica1 = view.getjXEstatistica1().getDate();
        Date dataEstatistica2 = view.getjXEstatistica2().getDate();

        if (bgSelecionado.equals("nome")) {
            msgmbean.filtraPrincipalPorNomeContato(view, text);
            grupombean.filtraGrupoPorNomeContato(view, text);
            contmbean.filtraContatoPorNome(view, text);
            msgmbean.filtraMensagensPorNomeContato(view, text);
            if (dataAgendada1 == null || dataAgendada2 == null) {
                msgmbean.filtraAgendadasPorNomeContato(view, text);
            } else {
                msgmbean.filtraAgendadasPorNomeContatoPorData(view, text, dataAgendada1, dataAgendada2);
            }

            if (dataEstatistica1 == null || dataEstatistica2 == null) {
                msgmbean.filtraEstatisticaPorNomeContato(view, text);
            } else {
                msgmbean.filtraEstatisticaPorContatoPorData(view, text, dataEstatistica1, dataEstatistica2);
            }


        } else if (bgSelecionado.equals("grupo")) {
            msgmbean.filtraPrincipalPorGrupoContato(view, text);
            grupombean.filtraGrupoPorNome(view, text);
            contmbean.filtraContatoPorGrupo(view, text);
            msgmbean.filtraMensagensPorGrupoContato(view, text);
            if (dataAgendada1 == null || dataAgendada2 == null) {
                msgmbean.filtraAgendadasPorGrupoContato(view, text);
            } else {
                msgmbean.filtraAgendadasPorGrupoContatoPorData(view, text, dataAgendada1, dataAgendada2);
            }
            if (dataEstatistica1 == null || dataEstatistica2 == null) {
                msgmbean.filtraEstatisticaPorGrupoContato(view, text);
            } else {
                msgmbean.filtraEstatisticaPorGrupoPorData(view, text, dataEstatistica1, dataEstatistica2);
            }
        } else if (bgSelecionado.equals("celular")) {
            msgmbean.filtraMensagensPorCelularContato(view, text);
            grupombean.filtraGrupoPorCelularContato(view, text);
            contmbean.filtraContatoPorCelular(view, text);
            msgmbean.filtraMensagensPorCelularContato(view, text);
            if (dataAgendada1 == null || dataAgendada2 == null) {
                msgmbean.filtraAgendadasPorCelularContato(view, text);
            } else {
                msgmbean.filtraAgendadasPorCelularContatoPorData(view, text, dataAgendada1, dataAgendada2);
            }
            if (dataEstatistica1 == null || dataEstatistica2 == null) {
                msgmbean.filtraEstatisticaPorCelularContato(view, text);
            } else {
                msgmbean.filtraEstatisticaPorCelularPorData(view, text, dataEstatistica1, dataEstatistica2);
            }
        } else if (bgSelecionado.equals("aniversário")) {
            msgmbean.filtraPrincipalPorAniversario(view, text);
            grupombean.filtraGrupoPorAniversarioContato(view, text);
            contmbean.filtraContatoPorAniversario(view, text);
            msgmbean.filtraMensagensPorAniversarioContato(view, text);
            if (dataAgendada1 == null || dataAgendada2 == null) {
                msgmbean.filtraAgendadasPorAniversarioContato(view, text);
            } else {
                msgmbean.filtraAgendadasPorAniversarioContatoPorData(view, text, dataAgendada1, dataAgendada2);
            }
            if (dataEstatistica1 == null || dataEstatistica2 == null) {
                msgmbean.filtraEstatisticaPorAniversarioContato(view, text);
            } else {
                msgmbean.filtraEstatisticaPorAniversarioPorData(view, text, dataEstatistica1, dataEstatistica2);
            }
        } else if (bgSelecionado.equals("todos")) {
            msgmbean.filtraTodos(view);
            grupombean.filtraTodosGrupos(view);
            contmbean.filtraTodos(view);
            msgmbean.filtraTodasMensagens(view);
            if (dataAgendada1 == null || dataAgendada2 == null) {
                msgmbean.filtraTodos(view);
            } else {
                msgmbean.filtraAgendadasPorNomeContatoPorData(view, "", dataAgendada1, dataAgendada2);
            }
            if (dataEstatistica1 == null || dataEstatistica2 == null) {
                msgmbean.filtraTodos(view);
            } else {
                msgmbean.filtraEstatisticaPorContatoPorData(view, "", dataEstatistica1, dataEstatistica2);
            }
        }


    }

    /**
     * Metodo para Atualizar todas as tabelas de todas das Abas da View
     * principal
     *
     * @param view View
     */
    public void atualizarTabelas(View view) {
        /**
         * CondiÃ§Ãµes podem ser retiradas ao termino do projeto
         */
        if (contmbean == null) {
            contmbean = new ContatoMBean();
        }
        if (grupombean == null) {
            grupombean = new GrupoMBean();
        }

        if (msgmbean == null) {
            msgmbean = new MensagemMBean();
        }
        msgmbean.filtraTodos(view);
        contmbean.filtraTodos(view);
        grupombean.filtraTodosGrupos(view); 
        msgmbean.filtraTodasMensagens(view); 
    }
}
